1 R-Package ourdata

Das R-Paket ourdata ist im Rahmen der Vorlesungen in den Studiengängen Audiovisuelle Medien & Online Publishing und Game Design & Management entstanden. Es enthält einen Großteil der zu Übungszwecken verwendeten Datensätze, sowie einige selbst-programmierte Funktionen mit den sich diese Daten manipulieren bzw. Diagramme ausgeben lassen.

1.1 Daten data

Das R-Paket ourdata enthält folgende Daten:

  • fragebogen
    • Kopfumfang und andere Merkmale aus dem GD- und AVM-Kurs.
    • Alter, Geschlecht, Mathenote, vor. Note, Angst, Interesse, Praxis
  • hdi
    • Weltweiter Index der menschlichen Entwicklung.
  • imr
    • Säuglingssterblichkeitsraten weltweit.
  • kirche
    • Kirchenaustritte in Deutschland von 2017 bis 2020.
  • koelsch
    • Konsum von Kölsch von 2017 bis 2020.

Mit der Funktion help() kannst Du Dir Hilfeseiten zu allen Datensätzen anzeigen lassen. Z.B. help(fragebogen) erklärt den Inhalt des Datenpaketes fragebogen.

1.2 Funktionen functions

Das R-Paket ourdata enthält folgende Funktionen:

  • combine(x, y, ...)
    • Kombiniert zwei Datensätze mit ID und Fremdschlüsselabgleich.
  • ourdata()
    • Druckt eine Willkommensnachricht aus.
  • plotter(...)
    • Zeichnet interaktiv mit variablen Daten verschiedene Diagramme.
  • transformer(x, ...)
    • Transformiert Werte vom Typ char in numerische Werte,
    • z.B. female zu 1, male zu 2 und ´diverszu3`.

Mit der Funktion help() kannst Du Dir Hilfeseiten zu allen Funktionen anzeigen lassen. Z.B. help(plotter) erklärt die Funktonsweise von der Funktion plotter().

2 GM_bac & AVM_bac 5.Sem.

In den Kursen GM_bac5 und AVM_bac5 im Fach Technical Applications & Data Analytics haben wir viele Themen der Datenanalyse betrachtet und uns einige technische Applikationen genauer angeschaut. Der Schwerpunkt lag auf R, einer Statistik-Programmiersprache, mit der übrigens auch dieses Dokument erstellt wurde.

Auf Ilias sind die Vorlesungsfolien sowie alle R-Skripte und sonstiges Material. Hier findest Du in ansprechender Weise aufbereitet Diagramme oder statistische Methoden und deren R-Code (dieser liegt zusätzlich auf Ilias im Ordner “Beispiel-Datensätze, Python und R-Skripte”). Der Code wartet darauf von Dir ausprobiert zu werden!

2.1 Diagramme plots

In R oder RStudio kann man verschiedene Diagramm-Typen zur Visualisation verwenden. Zur Hilfe dient die Funktion plottter() mit der man alle Diagramme (bis auf das Tortendiagramm) mit eigenen Daten ausführen kann.

Abb. 2.1a: Heatmap

Abb. 2.1a: Heatmap

Hier eine Auswahl der Diagramm-Typen, mit dem dazugehörigen Code:

2.1.1 Balkendiagramm

Das Balkendiagramm veranschaulicht die Verbindung zwischen einer numerischen und einer kategorialen Variablen. Das Balkendiagramm stellt jede Kategorie als Balken dar und spiegelt den entsprechenden numerischen Wert mit der Größe des Balkens wider.

# Balkendiagramm erstellen
barplot(kirche$Austritte, kirche$Jahr, main = "Kichenaustritte", col.main = "white", col.lab = "white", yaxt = "n", ylab = "Austritte (per 1.000)", xlab = "Jahreszahlen", names = c("2017", "2018", "2019", "2020"))
# Beschriftung für x- und y-Achse verbessern und die Farbgebung für das Dark-Theme anpassen
axis(1, at = 1:4, lwd = 3, lwd.ticks = 3, col = "white", col.ticks = "white", col.lab = "white", col.axis = "white")
ypos <- seq(0, 600000, by = 100000)
axis(2, at = ypos, labels = sprintf("%1.0f", ypos), lwd = 0.5, lwd.ticks = 1, col = "white", col.ticks = "white",  col.axis = "grey")

2.1.2 Box-Diagramm

Das Box-Diagramm zeigt die Verteilung einer numerischen Variablen basierend auf fünf zusammenfassenden Statistiken: - minimaler Nicht-Ausreißer - erstes Quartil - Median - drittes Quartil - Nicht-Ausreißer

Außerdem zeigen Boxplots die Positionierung von Ausreißern und ob die Daten verzerrt sind.

# Box-Diagramm erstellen
boxplot(koelsch$Koelsch, main = "Kölschkonsum", col.main = "white", col.lab = "white", yaxt = "n", ylab = "Kölschkonsum in Mil. Litern", xlab = "über den Zeitraum 2017 bis 2020", names = "2020")
# Beschriftung für die y-Achse verbessern und die Farbgebung für das Dark-Theme anpassen
ypos <- seq(160000000, 200000000, by = 10000000)
axis(2, at = ypos, labels = sprintf("%1.0fM.", ypos/1000000), lwd = 0.5, lwd.ticks = 1, col = "white", col.ticks = "white",  col.axis = "grey")

2.1.3 Dichtediagramm

Das Dichtediagramm zeigt die Verteilung einer numerischen Variablen über ein kontinuierliches Intervall. Peaks eines Dichtediagramms visualisieren, wo sich die Werte numerischer Variablen konzentrieren.

# Dichtediagramm erstellen
plot(density(fragebogen$alter), main = "Verteilung des Alters im Kurs", col.main = "white", col.lab = "white", yaxt = "n", ylab = "Personen (Dichte)", xlab = "Alter (in Jahren)")
# Beschriftung für die y-Achse verbessern und die Farbgebung für das Dark-Theme anpassen
ypos <- c(0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06)
axis(2, at = ypos, labels = sprintf("%1.0fP", ypos*50), lwd = 0.5, lwd.ticks = 1, col = "white", col.ticks = "white",  col.axis = "grey")

2.1.4 Heatmap

Eine **Heatmap*-Diagramm visualisiert einzelne Werte einer Matrix mit Farben. Häufigere Werte werden typischerweise durch hellere rötliche Farben angezeigt und weniger häufige** Werte werden typischerweise durch dunklere Farben angezeigt.

data <- matrix(rnorm(81, 0, 9), nrow = 9, ncol = 9)     # Beispiel Daten erstellen
colnames(data) <- paste0("Spalte ", 1:9)                # Spaltennamen setzen
rownames(data) <- paste0("Zeile ", 1:9)                 # Zeilennamen setzen
# Heatmap erstellen
heatmap(data, main = "Heatmap", col.main = "white", col.lab = "white")

2.1.5 Histogramm

Das Histogramm gruppiert kontinuierliche Daten in Bereiche und stellt diese Daten als Balken dar. Die Höhe jedes Balkens zeigt die Anzahl der Beobachtungen in jedem Bereich an.

# Histogramm erstellen
hist(fragebogen$kopf, main = "Kopfumfänge", col.main = "white", col.lab = "white", ylab = "Personen (Anzahl)", xlab = "Kopfumfang (in cm)")

2.1.6 Liniendiagramm

Das Liniendiagramm visualisiert Werte entlang einer Sequenz (z.B. über die Zeit). Liniendiagramme bestehen aus einer x-Achse und einer y-Achse. Die x-Achse zeigt normalerweise die Sequenz und die y-Achse die Werte an, die jedem Punkt der Sequenz entsprechen.

# Liniendiagramm erstellen
plot(fragebogen$note_mathe, type = "l", main = "Mathenoten", ylab = "Noten", xlab = "Person x",  yaxt = "n", col.main = "white", col.lab = "white")
# Beschriftung für die y-Achse verbessern und die Farbgebung für das Dark-Theme anpassen
ypos <- c(2, 3, 4, 5)
axis(2, at = ypos, labels = sprintf("%1.0f", ypos), lwd = 0.5, lwd.ticks = 1, col = "white", col.ticks = "white", col.lab = "grey", col.axis = "white")

2.1.7 Paar-Diagramm

Das Paar-Diagramm ist eine Diagrammmatrix, die aus Streudiagrammen für jede Variablenkombination eines Datenrahmens besteht.

# Paar-Diagramm erstellen
pairs(data.frame(fragebogen$interesse, fragebogen$note_annahme), main = "Zusammenhang Interesse und erwarteter Note", labels = c("Interesse", "erwartete Note"), col.main = "white", col.lab = "white")

2.1.8 Qqplot

Ein QQplot (oder Quantil-Quantil-Diagramm), bestimmt ob zwei Datenquellen aus einer gemeinsamen Verteilung stammen. QQplots ziehen die Quantile der beiden numerischen Datenquellen gegeneinander. Wenn beide Datenquellen aus derselben Verteilung stammen, fallen die Punkte auf einen Winkel von 45°.

# Qqplot erstellen
qqplot(fragebogen$geschlecht, fragebogen$note_mathe, main = "Geschlecht und Mathenote", yaxt = "n", ylab = "Mathenote", xaxt = "n", xlab = "Geschlecht (1 'weiblich', 2 'männlich')", col.main = "white", col.lab = "white")
# Beschriftung für x- und y-Achse verbessern und die Farbgebung für das Dark-Theme anpassen
xpos <- c(1, 2)
axis(1, at = xpos, labels = sprintf("%1.0f", xpos), lwd = 0.5, lwd.ticks = 1, col = "white", col.ticks = "white", col.lab = "grey", col.axis = "white")
ypos <- c(2, 3, 4 , 5)
axis(2, at = ypos, labels = sprintf("%1.0f", ypos), lwd = 0.5, lwd.ticks = 1, col = "white", col.ticks = "white", col.lab = "grey", col.axis = "white")

2.1.9 Streudiagramm

Das Streudiagramm zeigt zwei numerische Variablen mit Punkten an. Jeder Punkt zeigt den Wert einer Variablen auf der x-Achse und den Wert der anderen Variablen auf der y-Achse an.

# Daten zusammenfügen
df <- combine(imr$name, hdi$country, imr$value, hdi$hdi, col1 = "Land", col2 = "IMR", col3 = "HDI")
'data.frame':   175 obs. of  3 variables:
 $ Land: chr  "Afghanistan" "Central African Republic" "Niger" "Chad" ...
 $ IMR : num  106.8 84.2 68.1 67 65.3 ...
 $ HDI : num  0.496 0.381 0.377 0.401 0.438 0.413 0.588 0.446 0.427 0.574 ...
# Streudiagramm erstellen
plot(df$HDI, df$IMR, main = "Einfluss des HDI auf IMR", ylab = "IMR", xlab = "HDI", col.main = "white", col.lab = "white")

2.1.10 Tortendiagramm

Kreis- oder Torten-Diagramm, sind zwar weit verbreitet, weisen jedoch einige Nachteile auf:

  • Unterschiede zwischen den Anteilswerte sind weniger gut erkennbar, da dazu die Fläche der Kreissegmente verglichen werden muss
  • bei vielen Kategorien wird die Darstellung schnell unübersichtlich
  • sehr kleine Anteilswerte können oftmals nicht im Kreisdiagramm dargestellt werden

Aufgrund dieser Nachteile bietet sich die Verwendung von Kreisdiagramme nur in selten Fällen an, meist liefern Punkt- oder Balkendiagramme bessere Darstellungen.

# Beschriftung Gesamtzahl Jahr mit Prozentangabe erstellen
pie_labels <- paste0(kirche$Austritte, " (", round(100 * kirche$Austritte/sum(kirche$Austritte), 2), "%)")
# Kuchendiagramm erstellen
pie(kirche$Austritte, main = paste0("Kirchenaustritte pro Jahr (insg. ", sum(kirche$Austritte), ")"), labels = pie_labels, col = c("white", "lightblue", "mistyrose", "brown"))
# Legende erstellen
legend("topleft", legend = c("2017", "2018", "2019", "2020"), fill =  c("white", "lightblue", "mistyrose", "brown"))

2.1.11 Venn-Diagramm

Ein Venn-Diagramm (oder Primärdiagramm; Mengendiagramm; Logikdiagramm), veranschaulicht alle möglichen logischen Beziehungen zwischen bestimmten Datenmerkmalen. Jedes Merkmal wird als Kreis dargestellt, wobei überlappende Teile der Kreise Elemente darstellen, die beide Merkmale gleichzeitig aufweisen.

# Triple Venn Diagramm erstellen
draw.triple.venn(area1 = koelsch$Koelsch[4], area2 = kirche$Austritte[4], area3 = 1000000, n12 = 220000, n23 = 50000, n13 = 600000, n123 = 40000, main = "Kölsch -> Kirchenaustritt -> Köln?", fill = c("yellow", "brown", "blue"), category = c("Kölsch", "Kirche", "Köln"), main.col = "white", sub.col = "white", col = "white")

2.2 Data Mining data science

Die Methoden des Data Mining lassen sich grundsätzlich in die Gruppen Klassifikation, Prognose, Segmentierung und Abhängigkeitsentdeckung einteilen. Dazu kommen Algorithmen zum Einsatz.

Ein Algorithmus ist eine formale Handlungsvorschrift zur Lösung von Instanzen einer bestimmten Problemklasse. 1

Abb. 2.2a: Gruppen des Data Mining

Abb. 2.2a: Gruppen des Data Mining

Hier findest Du die Data Mining Methoden aus den Vorlesungen, mit dem dazugehörigen Code:

2.2.1 Korrelation Analyse

Will man einen Zusammenhang zwischen zwei metrischen Variablen untersuchen, zum Beispiel zwischen dem Alter und dem Gewicht von Kindern, so berechnet man eine Korrelation. Diese besteht aus einem Korrelationskoeffizienten (rho bei Spearman) und einem p-Wert.

Der Korrelationskoeffizient gibt die Stärke und die Richtung des Zusammenhangs an. Er liegt zwischen -1 und 1. Ein Wert nahe -1 bezeichnet einen starken negativen Zusammenhang (z.B. „Mehr zurückgelegte Strecke mit dem Auto, weniger Treibstoff im Tank“). Ein Wert nahe 1 spricht für einen starken positiven Zusammenhang (z.B. „mehr Futter, dickere Kühe“). Kein Zusammenhang besteht, wenn der Wert nahe 0 liegt.

Der p-Wert sagt aus, ob es einen signifikanten Zusammenhang gibt. p-Werte kleiner als 0,05 werden als statistisch signifikant bezeichnet.

# Beide Listen mit 'SQL JOIN' kombinieren
imr_hdi <- sqldf('SELECT imr.name AS "country", imr.value As "imr", hdi.hdi AS "hdi" FROM imr INNER JOIN hdi ON imr.name = hdi.country ORDER BY imr.value DESC')

# Streudiagramm (Scatterplot)
plot(imr_hdi$imr ~ imr_hdi$hdi, main = "HDI IMR Korrelation", ylab = "Säuglingssterblichkeit (per 1.000)", xlab = "Human Development Index", xlim = range(0:1), ylim = range(1:110))

# Quantifizierung der Zusammenhänge mittels Spearman Korrelation Funktion
cor.test(imr_hdi$imr, imr_hdi$hdi, method="spearman", exact=FALSE)

    Spearman's rank correlation rho

data:  imr_hdi$imr and imr_hdi$hdi
S = 1719986, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.9256444 

2.2.2 Linear Regress Analyse

Lineare Regression ist eines der nützlichsten Werkzeuge in der Statistik. Regressionsanalyse erlaubt es Zusammenhänge zwischen Parametern zu schätzen und somit ein erklärendes Model für das Auftreten gewisser Phänomene zu geben. Wirkliche Kausalität wird durch statistische Analysen dieser Art zwar nicht aufgedeckt, die Ergebnisse aus solchen Analysen können aber Hinweise in diese Richtung geben. 2

# Mittels Funktion 'combine' aus dem R-Paket 'ourdata' einen vergleichbaren Datensatz erstellen mit IMR und HDI
df <- combine(imr$name, hdi$country, imr$value, hdi$hdi, col1 = "Land", col2 = "IMR", col3 = "HDI")

# Lineares Modell mit 'lm' erstellen
mdl <- lm(IMR ~ HDI, data=df)

# 'summary' Funktion
summary(mdl)

# Den p-Wert für 'HDI' errechnen
matCoef <- summary(mdl)$coefficients
pval <- matCoef["HDI", 4]
print(paste0("Der Effekt vom HDI auf IMR ist statistisch signifikant p = ", round(pval, 2), " (", pval, ")."))

# Diagramm erstellen
plot(df$HDI, df$IMR, xlab = "Prädiktor", ylab = "Ergebnis", col = "darkblue", pch = 16, main = "Lineare Regression")
# Regressionsgrade erstellen
abline(mdl, col = "darkred")

'data.frame':   175 obs. of  3 variables:
 $ Land: chr  "Afghanistan" "Central African Republic" "Niger" "Chad" ...
 $ IMR : num  106.8 84.2 68.1 67 65.3 ...
 $ HDI : num  0.496 0.381 0.377 0.401 0.438 0.413 0.588 0.446 0.427 0.574 ...

Call:
lm(formula = IMR ~ HDI, data = df)

Residuals:
    Min      1Q  Median      3Q     Max 
-24.833  -4.900   0.041   5.132  59.646 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  103.266      3.467   29.78   <2e-16 ***
HDI         -113.229      4.733  -23.92   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 9.45 on 173 degrees of freedom
Multiple R-squared:  0.7679,    Adjusted R-squared:  0.7666 
F-statistic: 572.4 on 1 and 173 DF,  p-value: < 2.2e-16

[1] "Der Effekt vom HDI auf IMR ist statistisch signifikant p = 0 (9.32053277007954e-57)."

2.2.3 Basket Analyse

Die Basket Analyse kann zur Entdeckung von Assoziationen und Korrelationen zwischen Elementen in riesigen transaktionalen oder relationalen Datensätzen führen.

Das Aufsuchen von Verbindungen zwischen verschiedenen Artikeln, die Kunden in ihre „Warenkörbe“ legen ist ein häufiger Einsatz der Analyse. Das Wissen um diese Assoziationen kann für Einzelhändler oder Vermarkter hilfreich sein, um Marketingstrategien zu entwickeln. Das geschieht, indem sie Erkenntnisse darüber gewinnen, welche Artikel von Kunden häufig zusammen gekauft werden.

Wenn Kunden beispielsweise Milch kaufen, wie wahrscheinlich ist es, dass sie auf derselben Fahrt zum Supermarkt auch Brot (und welche Brotsorte) kaufen? Diese Informationen können zu einer Umsatzsteigerung führen, indem sie Einzelhändlern helfen, selektives Marketing zu betreiben und ihren Verkaufsraum zu planen.

# Bibliotheken laden
library(arules)     # Paket mit Mining Datensätzen und Assoziationsregeln
library(datasets)   # OpenIntro Datensätze

# Data frame laden
data(Groceries)

# Frequenz Diagramm für die Top 20 Artikel erstellen
itemFrequencyPlot(Groceries, topN = 20, type = "absolute", horiz = TRUE)

# nach Milch suchen
itemFrequency(Groceries)[grep("milk", itemLabels(Groceries))]
    whole milk    butter milk       UHT-milk condensed milk 
    0.25551601     0.02796136     0.03345196     0.01026945 
# Die Regeln ableiten
rules <- apriori(Groceries, parameter = list(supp = 0.001, conf = 0.8))
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen
        0.8    0.1    1 none FALSE            TRUE       5   0.001      1
 maxlen target  ext
     10  rules TRUE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 9 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [157 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 6 done [0.01s].
writing ... [410 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
# Zeige die Top 5 Regeln (nur 2 Nachkommastellen)
options(digits=2)
inspect(rules[1:5])
    lhs                         rhs            support confidence coverage lift
[1] {liquor, red/blush wine} => {bottled beer} 0.0019  0.90       0.0021   11.2
[2] {curd, cereals}          => {whole milk}   0.0010  0.91       0.0011    3.6
[3] {yogurt, cereals}        => {whole milk}   0.0017  0.81       0.0021    3.2
[4] {butter, jam}            => {whole milk}   0.0010  0.83       0.0012    3.3
[5] {soups, bottled beer}    => {whole milk}   0.0011  0.92       0.0012    3.6
    count
[1] 19   
[2] 10   
[3] 17   
[4] 10   
[5] 11   
rules <- sort(rules, by="confidence", decreasing = TRUE)
rules <- apriori(Groceries, parameter = list(supp = 0.001, conf = 0.8, maxlen = 10))
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen
        0.8    0.1    1 none FALSE            TRUE       5   0.001      1
 maxlen target  ext
     10  rules TRUE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 9 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [157 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 6 done [0.01s].
writing ... [410 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
# Paket mit Visualisations-Assoziationsregeln laden
library(arulesViz)

# Berechnungen der Matrix
subset.matrix <- is.subset(rules, rules)
subset.matrix[lower.tri(subset.matrix, diag = T)] <- NA
redundant <- colSums(subset.matrix, na.rm = T) >= 1

# Diagramm ausgeben
plot(rules, method = "graph", engine = "htmlwidget")

2.2.4 Cluster Analyse K-Means

K-Means ist ein Clustering-Verfahren, bei dem die Datensätze in eine Reihe von k Gruppen unterteilt werden, wobei k die vom Analysten vorgegebene Anzahl von Gruppen ist.

Die folgenden R-Codes zeigen, wie man die optimale Anzahl von Clustern bestimmt und wie man K-Means und PAM-Clustering in R berechnet.

Bestimmung der optimalen Anzahl von Clustern:

# Bibliotheken laden
library(cluster)
library(factoextra)
library(pheatmap)

# Datensatz von Verbrechern in den USA erstellen
mydata <- scale(USArrests) 

# K-Means Clustering
fviz_nbclust(mydata, kmeans, method = "gap_stat")
Abb. 2.2.4a: Optimal Number of Clusters

Abb. 2.2.4a: Optimal Number of Clusters

Berechnen und visualisieren des K-Means Cluster:

set.seed(123) # für die Reproduzierbarkeit
km.res <- kmeans(mydata, 3, nstart = 25)

# Visualisieren
fviz_cluster(km.res, data = mydata, palette = "jco", ggtheme = theme_minimal(), barfill = "red", barcolor   = "red", linecolor = "red")
Abb. 2.2.4b: Cluster

Abb. 2.2.4b: Cluster

Hierarchisches Clustering ist ein alternativer Ansatz zum partitionierenden Clustering, um Gruppen in einem Datensatz zu identifizieren. Bei diesem Verfahren muss die Anzahl der zu erzeugenden Cluster nicht im Voraus festgelegt werden.

Das Ergebnis des hierarchischen Clusterns ist eine baumartige Darstellung der Objekte, die auch als Dendrogramm bezeichnet wird. Die Beobachtungen können in Gruppen unterteilt werden, indem das Dendrogramm auf einem gewünschten Ähnlichkeitsniveau geschnitten wird:

# Hierarchisches Clustering
# Cluster Denrogramm
res.hc <- hclust(dist(mydata),  method = "ward.D2")
fviz_dend(res.hc, cex = 0.5, k = 4, palette = "jco")
Abb. 2.2.4c: Cluster Dendogramm

Abb. 2.2.4c: Cluster Dendogramm

Eine Heatmap ist eine weitere Möglichkeit, hierarchisches Clustering zu visualisieren. Sie wird auch als Falschfarbenbild bezeichnet, bei dem die Datenwerte in eine Farbskala umgewandelt werden. Mit Heatmaps können wir gleichzeitig Gruppen von Proben und Merkmalen visualisieren:

# Heatmap erstellen
pheatmap(t(mydata), cutree_cols = 4)
Abb. 2.2.4d: Cluster Heatmap

Abb. 2.2.4d: Cluster Heatmap

2.2.5 Neuronale Netze-Analyse

Ein neuronales Netz ist eine informationsverarbeitende Maschine und kann als Analogon zum menschlichen Nervensystem betrachtet werden. Genau wie das menschliche Nervensystem, das aus miteinander verbundenen Neuronen besteht, setzt sich ein neuronales Netz aus miteinander verbundenen informationsverarbeitenden Einheiten zusammen. Die informationsverarbeitenden Einheiten arbeiten nicht auf eine lineare Weise. Vielmehr bezieht das neuronale Netz seine Stärke aus der parallelen Verarbeitung von Informationen, die es ihm ermöglicht, mit Nichtlinearität umzugehen. Neuronale Netze sind nützlich, um aus komplexen Datensätzen eine Bedeutung abzuleiten und Muster zu erkennen.

Hier wird das neuronale Netz visualisiert. Unser Modell hat 3 Neuronen in seiner versteckten Schicht. Die schwarzen Linien zeigen die Verbindungen mit den Gewichten. Die Gewichte werden mit dem zuvor erläuterten Backpropagation-Algorithmus berechnet. Die gelben Linien stellen den Bias-Term dar:

# Bibliothek 'neuralnet' laden
library(neuralnet)

# Daten einlesen
data <- read.csv("cereals.csv", header=T)

# Zufälliges Zusammenstellen
samplesize = 0.60 * nrow(data)
set.seed(80)
index <- sample( seq_len ( nrow ( data ) ), size = samplesize )

# Erstelle Trainings- und Testdaten-Set
datatrain <- data[ index, ]
datatest <- data[ -index, ]

# Daten für neurales Netzwerk skalieren
max <- apply(data , 2 , max)
min <- apply(data, 2 , min)
scaled <- as.data.frame(scale(data, center = min, scale = max - min))

## Neuronales Netz anpassen 
# Erstelle Trainings- und Testdaten-Set
trainNN <- scaled[index , ]
testNN <- scaled[-index , ]

# Neuronales Netz anpassen 
set.seed(2)
NN <- neuralnet(rating ~ calories + protein + fat + sodium + fiber, trainNN, hidden = 3 , linear.output = T )

# Diagramm erstellen
plot(NN)
Abb. 2.2.5a: Neurales Netz

Abb. 2.2.5a: Neurales Netz

Hier wird die Bewertung des Modells mit Hilfe des neuronalen Netzmodells vorausgesagt. Die vorhergesagte Bewertung kann mit der realen Bewertung durch Visualisierung verglichen werden. Der RMSE für das neuronale Netzwerkmodell beträgt 6,05:

## Vorhersage mit Hilfe des neuronalen Netzes
predict_testNN <- compute(NN, testNN[,c(1:5)])
predict_testNN <- (predict_testNN$net.result * (max(data$rating) - min(data$rating))) + min(data$rating)

# Diagramm und Regressionsgrade erstellen
plot(datatest$rating, predict_testNN, col='blue', pch=16, ylab = "predicted rating NN", xlab = "real rating")
abline(0,1)
Abb. 2.2.5b: Neurales Netz

Abb. 2.2.5b: Neurales Netz

2.3 Sonstiges misc

Hier findest Du Code-Beispiele, Lustiges und Neuigkeiten rund um das Thema technische Applikationen & Datenanalyse:

2.3.1 Beispiel R-Code

Dieses Beispiel zeigt die Verwendung von Schleifen in R. Schleifen kommen in der Programmierung häufig zum Einsatz, z.B. zum Überprüfen von Übereinstimmungen in zwei verschiedenen Datensätzen.

# Komplexere R Skript (Programmierung)

# Einfacher Vektor, die Funktion c kombiniert Werte in einen Vektor oder eine Liste
fruitVec <- c("Apfel", "Banane", "Orange", "Birne") # fruitVec wird mit 4 Werten (Strings) gefüllt

# Einfache While-Schleife
# Funktion length: gibt die Länge eines/r Vektors / Liste aus
# Der Vektor fruitVec kann wie ein Array angesprochen werden, um die einzelnen Werte auszulesen
pos <- 1
while (pos <= length(fruitVec)) {
  print(paste0("Die Frucht Nr.", pos, " ist : ", fruitVec[pos]))
  pos <- pos + 1
}
[1] "Die Frucht Nr.1 ist : Apfel"
[1] "Die Frucht Nr.2 ist : Banane"
[1] "Die Frucht Nr.3 ist : Orange"
[1] "Die Frucht Nr.4 ist : Birne"
# Einfache For-Schleife
# Funktion paste0 verbindet Strings
# Funktion which ermittelt die Position eines Wertes im Vektor (bzw. Array)
help(which)
for (fruit in fruitVec) {
  print(paste0("Die Frucht Nr.", which(fruit == fruitVec), " ist: ", fruit))
}
[1] "Die Frucht Nr.1 ist: Apfel"
[1] "Die Frucht Nr.2 ist: Banane"
[1] "Die Frucht Nr.3 ist: Orange"
[1] "Die Frucht Nr.4 ist: Birne"

2.3.2 Ext. R-Code ausführen

Dieser Code steht in der Datei example.R und wir von R-Markdown eingelesen und ausgeführt.

# x Werte von 1 und 100 zuweisen
x <- 1:100
# y 100 Werte zuweisen mit x + Zufallszahl (-5 bis +5)
y <- x + rnorm(100, sd = 5)
# Gibt den ersten oder letzten Teil eines Vektors, einer Matrix oder einer Tabelle zurück
head(data.frame(x, y))
plot(x, y)

2.3.3 Katzen-Statistik

1000 Wissenschaftler haben ganz unabhängig voneinander (unter der Einhaltung aller wissenschaftlichen Voraussetzungen) herausgefunden:

Abb. 2.3.7a: Katzen-Statistik

Abb. 2.3.7a: Katzen-Statistik

2.3.4 Big Data-Jobs

Ein spannender Artikel (falls nicht mehr verfügbar - klick in den Artikel) der die Jobs im Big Data Bereich identifiziert und mögliche Gehälter (in Dollar) auflistet:

PDF Loading Page Top 7 Big Data Jobs

2.3.5 BenBox.org

Seit meiner Kindheit spiele ich Computer-Spiele allen Genres. Insbesondere Adventure Games, wie die Klassiker Indiana Jones, Monkey Island und der moderne Ableger Baphomets Fluch bzw. Broken Sword, haben mich immer wieder vor den Bildschirm gelockt. So lag es nicht fern, mal ein eigenes Adventure Game zu kreieren.

Hier meine BenBox.org Webseite für meinen iPad Spiele-Prototypen, den ich während meines Studiums an der Hochschule Fresenius im Studiengang Gesundheit & Management (B. Sc.) erstellt habe:

BeBox.org Landing Page BenBox.org Landing Page

Literaturverzeichnis lit.

Hier ist die Literatur die im Fach Technical Applications & Data Analytics zum Einsatz kam aufgelistet:

  • Cleve, J/Lämmel, U. [2020]
    Data Mining, 3. Auflage, Berlin/Boston 2020

  • Romeijn, J. W. [2016]
    Philosophy of Statistics. In E. N. Zalta (Hrsg.), The Stanford Encyclopedia of Philosophy, Stanford 2016

  • Sauer, S. [2019]
    Moderne Datenanalyse mit R, Wiesbaden 2019

  • Tukey, J. W. [1962]
    The future of data analysis. The Annals of Mathematical Statistics, Vol. 33, No. 1, Institute of Mathematical Statistics 1962

  • Wickham, H./Garrett G. [2017]
    R for Data Science, O‘Reilly Media 2017

  • Wozabal, D. [2007]
    Statistisches Programmieren – Regressionen in R (Session 6), 2007

  1. Sauer [2019]↩︎

  2. Wozabal [2007]↩︎

Benjamin Groß, Subbelratherstr. 337, 50825 Cologne, Germany.

Copyright © 2021 All rights reserved.